#include <stdio.h>
#include <string.h>

#define MAX 20

int n;
char name[MAX][100];
int order[MAX];//存储当前的排列
int chosen[MAX];//布尔数组，用于标记哪些元素已经被选中

void calc(int x);

void calc(int x) {//n:要填充的总位置数（也代表name,order和chosen数组的大小），x：当前正在填充的位置
    if (x == n + 1) {//当所有的位置都已经填充完毕
        for (int i = 1; i <= n; i++) {
            printf("%s ", name[order[i] - 1]);//输出当前的排列
        }
        printf("\n");
        return;
    }

    for (int i = 1; i <= n; i++) {
        if (chosen[i]) continue;//如果i已经被选中，那么跳过它
        order[x] = i;//把当前元素i放入位置x
        chosen[i] = 1;//标记i为已选中
        calc(x + 1);//递归调用calc函数，填充下一个位置
        chosen[i] = 0;//回溯，标记i为未选中
        order[x] = 0;//回溯，清空位置x
    }
}

int main() {
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        scanf("%s", name[i]);
    }

    calc(1);

    return 0;
}
